package com.davidlife.javase.datatype;

import java.io.Console;
import java.util.Scanner;

public class StandardInput {

	public static void main(String[] args) {

		/**
		 * 知识点：当采用命令行方式启动一个程序时，可以利用shell的重定向语法将任意文件关联到System.in和System.out,如：
		 * java StandardInput < myfile.txt > output.txt
		 * (注意：当然如果用上面的命令行并重定向输入输出的方式启动程序的话，则下面的System.console()会返回null，程序会报空指针异常)
		 */
		Scanner in = new Scanner(System.in);
		
		System.out.println("What's your name: ");
		String name = in.nextLine();
		
		System.out.println("How old are you: ");
		int age = in.nextInt();
		
		//因为输入是可见的， 所以Scanner 类不适用于从控制台读取密码。Java SE 6 特别
		//引入了Console 类实现这个目的。要想读取一个密码， 可以采用下列代码
		//为了安全起见， 返回的密码存放在一维字符数组中， 而不是字符串中。在对密码进
		//行处理之后， 应该马上用一个填充值覆盖数组元素
		//采用Console 对象处理输入不如采用Scanner 方便。每次只能读取一行输入， 而没有
		//能够读取一个单词或一个数值的方法。
		Console cons = System.console();
		String username = cons.readLine("User name: ");
		char[] password = cons.readPassword("Password: ");
		
		if("admin".equals(username) && "pwd".equals(String.valueOf(password)))
			System.out.println("Hello, " + name + ". Next year, you'll be " + (age + 1));
		else
			System.out.println("Wrong username or password !");
		
		in.close();
	}
}
/*注意：
上述在Eclipse环境下用于读取用户名和密码的console会报NullPointerException，而在控制台下却可以获得Console实例。
原因： 如果你的Java程序要与Windows下的cmd或者Linux下的Terminal交互，就可以用这个Java Console类代劳。Java要与Console进行交互，不总是能得到可用的Java Console类的。一个JVM是否有可用的Console，依赖于底层平台和JVM如何被调用。如果JVM是在交互式命令行（比如Windows的cmd）中启动的，并且输入输出没有重定向到另外的地方，那么就我们可以得到一个可用的Console实例。

　　当你有Eclipse或NetBean中运行以上代码时Console中将会有以下文字输出：

　　Console is unavailable.

　　表示Java程序无法获得Console实例，是因为JVM不是在命令行中被调用的，或者输入输出被重定向了。
在Eclipse诸如类似的IDE工具中运行Console类。如果没有对Console实例判空操作,结果使用了该实例会抛出java.lang.NullPointerException异常

Console API解释：
static Console console( ) 6
如果有可能进行交互操作， 就通过控制台窗口为交互的用户返回一个Console 对象，
否则返回null。对于任何一个通过控制台窗口启动的程序， 都可使用Console 对象。
否则， 其可用性将与所使用的系统有关s
*/
